// **************************************************************
// Copyright (c) 2021 Xidian University.
// File name     : phy_mac_interfave.v
// Module name   : 
// Created Date  : 2021-07-31 12:32:13
// Author        : Zhang-Jianyuan
// Email         : 1227850326@qq.com
// -------------------------------------------------------------------------
// Version       : 
// Last Modified : 2021-07-31 12:32:13
// Modified By   : 
// -------------------------------------------------------------------------
// 
// -------------------------------------------------------------------------
// HISTORY       : 
// Date        	By	Comments
// ------------	--	----------------------------------------------------------
// 
// 
// 
// **************************************************************
// 
// 
// 
// *******************
// TIMESCALE
// *******************
// 
// 
// 
// *******************
// INCLUDE
// *******************
// 
`include "top_define.v"
// 
// *******************
// INFORMATION
// *******************
// 
// 
// 
// *******************
// DEFINE(s)
// *******************
// 
// 
// 
// *******************
// DEFINE MODULE PORT
// *******************
// 
module phy_mac_interface(
     input  wire        clk
    ,input  wire        rst_n
    ,output reg  [31:0] np_data_out                   
    ,output reg         np_data_out_vld
    ,input  wire [31:0] np_data_in                    
    ,input  wire [18:0] np_addr_in    
    ,input  wire        np_wr
    ,input  wire        np_rd                
    // ,input  wire [ 7:0] bus1_np_addr_ctrl       
    // ,input  wire [ 7:0] bus2_np_addr_ctrl 
    // ,input  wire [ 7:0] bus3_np_addr_ctrl 
    // ,input  wire [ 7:0] bus4_np_addr_ctrl 

    ,input  wire [ 8:0] bus1_ack_register
    ,input  wire [27:0] bus1_mac_pcs_status_register0
    ,input  wire [16:0] bus1_mac_pcs_status_register2
    ,input  wire [31:0] bus1_mac_pcs_status_register7
    ,input  wire [31:0] bus1_mac_pcs_status_register8
    ,output reg  [25:0] bus1_reset_register
    ,output reg  [16:0] bus1_phy_ctrl_register
    ,output reg  [ 8:0] bus1_req_lb_register
    ,output reg  [11:0] bus1_mac_pcs_status_register1
    ,output reg  [31:0] bus1_mac_pcs_status_register3
    ,output reg  [31:0] bus1_mac_pcs_status_register4
    ,output reg  [31:0] bus1_mac_pcs_status_register5
    ,output reg  [31:0] bus1_mac_pcs_status_register6
    

    ,input  wire [ 8:0] bus2_ack_register
    ,input  wire [27:0] bus2_mac_pcs_status_register0
    ,input  wire [16:0] bus2_mac_pcs_status_register2
    ,input  wire [31:0] bus2_mac_pcs_status_register7
    ,input  wire [31:0] bus2_mac_pcs_status_register8
    ,output reg  [25:0] bus2_reset_register
    ,output reg  [16:0] bus2_phy_ctrl_register
    ,output reg  [ 8:0] bus2_req_lb_register
    ,output reg  [11:0] bus2_mac_pcs_status_register1
    ,output reg  [31:0] bus2_mac_pcs_status_register3
    ,output reg  [31:0] bus2_mac_pcs_status_register4
    ,output reg  [31:0] bus2_mac_pcs_status_register5
    ,output reg  [31:0] bus2_mac_pcs_status_register6


    ,input  wire [ 8:0] bus3_ack_register
    ,input  wire [27:0] bus3_mac_pcs_status_register0
    ,input  wire [16:0] bus3_mac_pcs_status_register2
    ,input  wire [31:0] bus3_mac_pcs_status_register7
    ,input  wire [31:0] bus3_mac_pcs_status_register8
    ,output reg  [25:0] bus3_reset_register
    ,output reg  [16:0] bus3_phy_ctrl_register
    ,output reg  [ 8:0] bus3_req_lb_register
    ,output reg  [11:0] bus3_mac_pcs_status_register1
    ,output reg  [31:0] bus3_mac_pcs_status_register3
    ,output reg  [31:0] bus3_mac_pcs_status_register4
    ,output reg  [31:0] bus3_mac_pcs_status_register5
    ,output reg  [31:0] bus3_mac_pcs_status_register6


    ,input  wire [ 8:0] bus4_ack_register
    ,input  wire [27:0] bus4_mac_pcs_status_register0
    ,input  wire [16:0] bus4_mac_pcs_status_register2
    ,input  wire [31:0] bus4_mac_pcs_status_register7
    ,input  wire [31:0] bus4_mac_pcs_status_register8
    ,output reg  [25:0] bus4_reset_register
    ,output reg  [16:0] bus4_phy_ctrl_register
    ,output reg  [ 8:0] bus4_req_lb_register
    ,output reg  [11:0] bus4_mac_pcs_status_register1
    ,output reg  [31:0] bus4_mac_pcs_status_register3
    ,output reg  [31:0] bus4_mac_pcs_status_register4
    ,output reg  [31:0] bus4_mac_pcs_status_register5
    ,output reg  [31:0] bus4_mac_pcs_status_register6

    ,output reg         bus1_xlpcs_reg_wren
    ,output reg         bus1_xlpcs_reg_rden
    ,output reg  [15:0] bus1_xlpcs_reg_addr
    ,output reg  [15:0] bus1_xlpcs_reg_din 
    ,input  wire [15:0] bus1_xlpcs_reg_dout
    ,input  wire        bus1_xlpcs_reg_busy
    ,output reg         bus1_xpcs_reg_wren
    ,output reg         bus1_xpcs_reg_rden
    ,output reg  [15:0] bus1_xpcs_reg_addr
    ,output reg  [15:0] bus1_xpcs_reg_din 
    ,input  wire [15:0] bus1_xpcs_reg_dout
    ,input  wire        bus1_xpcs_reg_busy
    ,output reg         bus1_mac_reg_wren
    ,output reg         bus1_mac_reg_rden
    ,output reg  [ 7:0] bus1_mac_reg_addr
    ,output reg  [31:0] bus1_mac_reg_din 
    ,input  wire [31:0] bus1_mac_reg_dout
    ,input  wire        bus1_mac_reg_busy

    ,output reg         bus2_xlpcs_reg_wren
    ,output reg         bus2_xlpcs_reg_rden
    ,output reg  [15:0] bus2_xlpcs_reg_addr
    ,output reg  [15:0] bus2_xlpcs_reg_din 
    ,input  wire [15:0] bus2_xlpcs_reg_dout
    ,input  wire        bus2_xlpcs_reg_busy
    ,output reg         bus2_xpcs_reg_wren
    ,output reg         bus2_xpcs_reg_rden
    ,output reg  [15:0] bus2_xpcs_reg_addr
    ,output reg  [15:0] bus2_xpcs_reg_din 
    ,input  wire [15:0] bus2_xpcs_reg_dout
    ,input  wire        bus2_xpcs_reg_busy
    ,output reg         bus2_mac_reg_wren
    ,output reg         bus2_mac_reg_rden
    ,output reg  [ 7:0] bus2_mac_reg_addr
    ,output reg  [31:0] bus2_mac_reg_din 
    ,input  wire [31:0] bus2_mac_reg_dout
    ,input  wire        bus2_mac_reg_busy

    ,output reg         bus3_xlpcs_reg_wren
    ,output reg         bus3_xlpcs_reg_rden
    ,output reg  [15:0] bus3_xlpcs_reg_addr
    ,output reg  [15:0] bus3_xlpcs_reg_din 
    ,input  wire [15:0] bus3_xlpcs_reg_dout
    ,input  wire        bus3_xlpcs_reg_busy
    ,output reg         bus3_xpcs_reg_wren
    ,output reg         bus3_xpcs_reg_rden
    ,output reg  [15:0] bus3_xpcs_reg_addr
    ,output reg  [15:0] bus3_xpcs_reg_din 
    ,input  wire [15:0] bus3_xpcs_reg_dout
    ,input  wire        bus3_xpcs_reg_busy
    ,output reg         bus3_mac_reg_wren
    ,output reg         bus3_mac_reg_rden
    ,output reg  [ 7:0] bus3_mac_reg_addr
    ,output reg  [31:0] bus3_mac_reg_din 
    ,input  wire [31:0] bus3_mac_reg_dout
    ,input  wire        bus3_mac_reg_busy

    ,output reg         bus4_xlpcs_reg_wren
    ,output reg         bus4_xlpcs_reg_rden
    ,output reg  [15:0] bus4_xlpcs_reg_addr
    ,output reg  [15:0] bus4_xlpcs_reg_din 
    ,input  wire [15:0] bus4_xlpcs_reg_dout
    ,input  wire        bus4_xlpcs_reg_busy
    ,output reg         bus4_xpcs_reg_wren
    ,output reg         bus4_xpcs_reg_rden
    ,output reg  [15:0] bus4_xpcs_reg_addr
    ,output reg  [15:0] bus4_xpcs_reg_din 
    ,input  wire [15:0] bus4_xpcs_reg_dout
    ,input  wire        bus4_xpcs_reg_busy
    ,output reg         bus4_mac_reg_wren
    ,output reg         bus4_mac_reg_rden
    ,output reg  [ 7:0] bus4_mac_reg_addr
    ,output reg  [31:0] bus4_mac_reg_din 
    ,input  wire [31:0] bus4_mac_reg_dout
    ,input  wire            bus4_mac_reg_busy

    
);
//========================================================
reg [18:0]np_addr_in_d1;
reg [31:0]np_data_in_d1;
always@(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        np_addr_in_d1 <= 'b0;
        np_data_in_d1 <= 'b0;
    end else begin
        np_addr_in_d1 <= np_addr_in;
        np_data_in_d1 <= np_data_in;
    end
end
//========================================================


//========================================================
reg  bus1_cpu_reg_wren;
reg  bus1_cpu_reg_rden;
reg  bus2_cpu_reg_wren;
reg  bus2_cpu_reg_rden;
reg  bus3_cpu_reg_wren;
reg  bus3_cpu_reg_rden;
reg  bus4_cpu_reg_wren;
reg  bus4_cpu_reg_rden;
//----------------------------------------------------
//bus1
always @(posedge clk or negedge rst_n) begin
    if(~rst_n)
        bus1_cpu_reg_wren <= 1'b0;
    else if(np_wr)
        bus1_cpu_reg_wren <= !(|np_addr_in[18:10]);
    else
        bus1_cpu_reg_wren <= 1'b0;
end

always @(posedge clk or negedge rst_n) begin
    if(~rst_n)
        bus1_cpu_reg_rden <= 1'b0;
    else if(np_rd)
        bus1_cpu_reg_rden <= !(|np_addr_in[18:10]);
    else
        bus1_cpu_reg_rden <= 1'b0;
end

//----------------------------------------------------
//bus2
always @(posedge clk or negedge rst_n) begin
    if(~rst_n)
        bus2_cpu_reg_wren <= 1'b0;
    else if(np_wr && !np_addr_in[18] && np_addr_in[17])
        bus2_cpu_reg_wren <= !(|{np_addr_in[16:10]});
    else
        bus2_cpu_reg_wren <= 1'b0;
end

always @(posedge clk or negedge rst_n) begin
    if(~rst_n)
        bus2_cpu_reg_rden <= 1'b0;
    else if(np_rd && !np_addr_in[18] && np_addr_in[17])
        bus2_cpu_reg_rden <= !(|np_addr_in[16:10]);
    else
        bus2_cpu_reg_rden <= 1'b0;
end

//----------------------------------------------------
//bus3
always @(posedge clk or negedge rst_n) begin
    if(~rst_n)
        bus3_cpu_reg_wren <= 1'b0;
    else if(np_wr && np_addr_in[18] && !np_addr_in[17])
        bus3_cpu_reg_wren <= !(|{np_addr_in[16:10]});
    else
        bus3_cpu_reg_wren <= 1'b0;
end

always @(posedge clk or negedge rst_n) begin
    if(~rst_n)
        bus3_cpu_reg_rden <= 1'b0;
    else if(np_rd && np_addr_in[18] && !np_addr_in[17])
        bus3_cpu_reg_rden <= !(|np_addr_in[16:10]);
    else
        bus3_cpu_reg_rden <= 1'b0;
end

//----------------------------------------------------
//bus4
always @(posedge clk or negedge rst_n) begin
    if(~rst_n)
        bus4_cpu_reg_wren <= 1'b0;
    else if(np_wr && np_addr_in[18] && np_addr_in[17])
        bus4_cpu_reg_wren <= !(|{np_addr_in[16:10]});
    else
        bus4_cpu_reg_wren <= 1'b0;
end

always @(posedge clk or negedge rst_n) begin
    if(~rst_n)
        bus4_cpu_reg_rden <= 1'b0;
    else if(np_rd && np_addr_in[18] && np_addr_in[17])
        bus4_cpu_reg_rden <= !(|np_addr_in[16:10]);
    else
        bus4_cpu_reg_rden <= 1'b0;
end
//==============================================================
wire addr_xlpcs_en;
wire addr_xpcs_en;
wire addr_mac_en;
//2022.6.9
assign addr_xlpcs_en = np_addr_in[16:10]>=`XLPCS_BASE_ADDR && np_addr_in[16:10]<`XLPCS_BASE_ADDR_H;
// assign addr_xlpcs_en = np_addr_in[16:10]>=`XLPCS_BASE_ADDR && np_addr_in[16:10]<`XPCS_BASE_ADDR;
assign addr_xpcs_en = np_addr_in[16:10]==`XPCS_BASE_ADDR;
// assign addr_xpcs_en = np_addr_in[16:10]>=`XPCS_BASE_ADDR && np_addr_in[16:10]<`MAC_BASE_ADDR;
assign addr_mac_en = np_addr_in[16:10]==`MAC_BASE_ADDR;
//=====================================================================================
//bus1 reg write
always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus1_reset_register <= 26'h2000200;
    else if(bus1_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_RESET)
        bus1_reset_register <= np_data_in_d1[25:0];
    // else 
    //     bus1_reset_register <= bus1_reset_register ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus1_phy_ctrl_register <= 17'h1281;
    else if(bus1_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_PHY_CTRL_REGISTER)
        bus1_phy_ctrl_register <= np_data_in_d1[16:0];
    // else 
    //     bus1_phy_ctrl_register <= bus1_phy_ctrl_register ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus1_req_lb_register <= 9'b0;
    else if(bus1_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_REQ_LB_REGISTER)
        bus1_req_lb_register <= np_data_in_d1[ 8:0] ;
    // else 
    //     bus1_req_lb_register <= bus1_req_lb_register ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus1_mac_pcs_status_register1 <= 12'b0;
    else if(bus1_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_MAC_PCS_STATUS_REGISTER1)
        bus1_mac_pcs_status_register1 <= np_data_in_d1[11:0];
    // else 
    //     bus1_mac_pcs_status_register1 <= bus1_mac_pcs_status_register1 ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus1_mac_pcs_status_register3 <= 32'b0;
    else if(bus1_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_MAC_PCS_STATUS_REGISTER3)
        bus1_mac_pcs_status_register3 <= np_data_in_d1;
    // else 
    //     bus1_mac_pcs_status_register3 <= bus1_mac_pcs_status_register3 ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus1_mac_pcs_status_register4 <= 32'b0;
    else if(bus1_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_MAC_PCS_STATUS_REGISTER4)
        bus1_mac_pcs_status_register4 <= np_data_in_d1;
    // else 
    //     bus1_mac_pcs_status_register4 <= bus1_mac_pcs_status_register4 ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus1_mac_pcs_status_register5 <= 32'b0;
    else if(bus1_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_MAC_PCS_STATUS_REGISTER5)
        bus1_mac_pcs_status_register5 <= np_data_in_d1;
    // else 
    //     bus1_mac_pcs_status_register5 <= bus1_mac_pcs_status_register5 ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus1_mac_pcs_status_register6 <= 32'b0;
    else if(bus1_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_MAC_PCS_STATUS_REGISTER6)
        bus1_mac_pcs_status_register6 <= np_data_in_d1;
    // else 
    //     bus1_mac_pcs_status_register6 <= bus1_mac_pcs_status_register6 ;
end

//==============================================================
always @(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        bus1_xlpcs_reg_wren <= 1'b0;
        bus1_xlpcs_reg_rden <= 1'b0;
        bus1_xlpcs_reg_addr <= 16'b0;
        bus1_xlpcs_reg_din  <= 16'b0;
    end else if (np_wr && np_addr_in[18:17]==2'b00 && addr_xlpcs_en)begin
        bus1_xlpcs_reg_wren <= 1'b1;
        bus1_xlpcs_reg_rden <= 1'b0;
        bus1_xlpcs_reg_addr <= {np_addr_in[10], 5'b0, np_addr_in[9:0]};// 2022.6.9
        // bus1_xlpcs_reg_addr <= np_addr_in[15:0];
        bus1_xlpcs_reg_din  <= np_data_in[15:0];
    end else if (np_rd && np_addr_in[18:17]==2'b00 && addr_xlpcs_en)begin
        bus1_xlpcs_reg_wren <= 1'b0;
        bus1_xlpcs_reg_rden <= 1'b1;
        bus1_xlpcs_reg_addr <= {np_addr_in[10], 5'b0, np_addr_in[9:0]};// 2022.6.9
        // bus1_xlpcs_reg_addr <= np_addr_in[15:0];
        bus1_xlpcs_reg_din  <= 16'b0;
    end else if (~bus1_xlpcs_reg_busy)begin
        bus1_xlpcs_reg_wren <= 1'b0;
        bus1_xlpcs_reg_rden <= 1'b0;
        bus1_xlpcs_reg_addr <= 16'b0;
        bus1_xlpcs_reg_din  <= 16'b0;
    end 
    // else begin
    //     bus1_xlpcs_reg_wren <= bus1_xlpcs_reg_wren;
    //     bus1_xlpcs_reg_rden <= bus1_xlpcs_reg_rden;
    //     bus1_xlpcs_reg_addr <= bus1_xlpcs_reg_addr;
    //     bus1_xlpcs_reg_din  <= bus1_xlpcs_reg_din ;
    // end
end

always @(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        bus1_xpcs_reg_wren <= 1'b0;
        bus1_xpcs_reg_rden <= 1'b0;
        bus1_xpcs_reg_addr <= 16'b0;
        bus1_xpcs_reg_din  <= 16'b0;
    end else if (np_wr && np_addr_in[18:17]==2'b00 && addr_xpcs_en)begin
        bus1_xpcs_reg_wren <= 1'b1;
        bus1_xpcs_reg_rden <= 1'b0;
        bus1_xpcs_reg_addr <= {6'b0, np_addr_in[9:0]};// 2022.6.9
        // bus1_xpcs_reg_addr <= np_addr_in[15:0];
        bus1_xpcs_reg_din  <= np_data_in[15:0];
    end else if (np_rd && np_addr_in[18:17]==2'b00 && addr_xpcs_en)begin
        bus1_xpcs_reg_wren <= 1'b0;
        bus1_xpcs_reg_rden <= 1'b1;
        bus1_xpcs_reg_addr <= {6'b0, np_addr_in[9:0]};// 2022.6.9
        // bus1_xpcs_reg_addr <= np_addr_in[15:0];
        bus1_xpcs_reg_din  <= 16'b0;
    end else if (~bus1_xpcs_reg_busy)begin
        bus1_xpcs_reg_wren <= 1'b0;
        bus1_xpcs_reg_rden <= 1'b0;
        bus1_xpcs_reg_addr <= 16'b0;
        bus1_xpcs_reg_din  <= 16'b0;
    end 
    // else begin
    //     bus1_xpcs_reg_wren <= bus1_xpcs_reg_wren;
    //     bus1_xpcs_reg_rden <= bus1_xpcs_reg_rden;
    //     bus1_xpcs_reg_addr <= bus1_xpcs_reg_addr;
    //     bus1_xpcs_reg_din  <= bus1_xpcs_reg_din ;
    // end
end


always @(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        bus1_mac_reg_wren <= 1'b0;
        bus1_mac_reg_rden <= 1'b0;
        bus1_mac_reg_addr <= 16'b0;
        bus1_mac_reg_din  <= 16'b0;
    end else if (np_wr && np_addr_in[18:17]==2'b00 && addr_mac_en)begin 
        bus1_mac_reg_wren <= 1'b1;
        bus1_mac_reg_rden <= 1'b0;
        bus1_mac_reg_addr <= np_addr_in[ 7:0];
        bus1_mac_reg_din  <= np_data_in[15:0];
    end else if (np_rd && np_addr_in[18:17]==2'b00 && addr_mac_en)begin
        bus1_mac_reg_wren <= 1'b0;
        bus1_mac_reg_rden <= 1'b1;
        bus1_mac_reg_addr <= np_addr_in[ 7:0];
        bus1_mac_reg_din  <= 16'b0;
    end else if (~bus1_mac_reg_busy)begin
        bus1_mac_reg_wren <= 1'b0;
        bus1_mac_reg_rden <= 1'b0;
        bus1_mac_reg_addr <= 16'b0;
        bus1_mac_reg_din  <= 16'b0;
    end 
    // else begin
    //     bus1_mac_reg_wren <= bus1_mac_reg_wren;
    //     bus1_mac_reg_rden <= bus1_mac_reg_rden;
    //     bus1_mac_reg_addr <= bus1_mac_reg_addr;
    //     bus1_mac_reg_din  <= bus1_mac_reg_din ;
    // end
end
//------------------------------------------------------
//bus1 reg read
reg [31:0]bus1_reg_data_out;
reg bus1_reg_data_out_vld;
// reg bus1_cpu_reg_rden_d1;
// always@(posedge clk or negedge rst_n)begin
//     if(~rst_n)
//         bus1_cpu_reg_rden_d1 <= 1'b0;
//     else
//         bus1_cpu_reg_rden_d1 <= bus1_cpu_reg_rden;
// end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        bus1_reg_data_out <= 32'b0;
        bus1_reg_data_out_vld <= 1'b0;
    end else if(bus1_cpu_reg_rden)begin
        case(np_addr_in_d1[9:0])
            `ADDR_RESET                   : begin
                bus1_reg_data_out <= {6'b0,bus1_reset_register}   ;
                bus1_reg_data_out_vld <= 1'b1;
            end
            `ADDR_PHY_CTRL_REGISTER       : begin
                bus1_reg_data_out <= {15'b0,bus1_phy_ctrl_register};
                bus1_reg_data_out_vld <= 1'b1;
            end
            `ADDR_REQ_LB_REGISTER         : begin
                bus1_reg_data_out <= {23'b0,bus1_req_lb_register} ;
                bus1_reg_data_out_vld <= 1'b1;
            end
            `ADDR_ACK_REGISTER            : begin
                bus1_reg_data_out <= {23'b0,bus1_ack_register}    ;
                bus1_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER0: begin
                bus1_reg_data_out <= {4'b0,bus1_mac_pcs_status_register0};
                bus1_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER1: begin
                bus1_reg_data_out <= {20'b0,bus1_mac_pcs_status_register1};
                bus1_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER2: begin
                bus1_reg_data_out <= {15'b0,bus1_mac_pcs_status_register2};
                bus1_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER3: begin
                bus1_reg_data_out <= bus1_mac_pcs_status_register3;
                bus1_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER4: begin
                bus1_reg_data_out <= bus1_mac_pcs_status_register4;
                bus1_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER5: begin
                bus1_reg_data_out <= bus1_mac_pcs_status_register5;
                bus1_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER6: begin
                bus1_reg_data_out <= bus1_mac_pcs_status_register6;
                bus1_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER7: begin
                bus1_reg_data_out <= bus1_mac_pcs_status_register7;
                bus1_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER8: begin
                bus1_reg_data_out <= bus1_mac_pcs_status_register8;
                bus1_reg_data_out_vld <= 1'b1;
            end
            default                       : begin
                // bus1_reg_data_out <= bus1_reg_data_out ;
                bus1_reg_data_out_vld <= 1'b0;
            end
        endcase 
    end else begin
        // bus1_reg_data_out <= bus1_reg_data_out ;
        bus1_reg_data_out_vld <= 1'b0;
    end
end
//---------------------------------------------------------
reg [31:0]bus1_reg_reg_data_out;
reg bus1_reg_reg_data_out_vld;

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        bus1_reg_reg_data_out <= 32'b0;
        bus1_reg_reg_data_out_vld <= 1'b0;
    end else if (bus1_xlpcs_reg_rden && ~bus1_xlpcs_reg_busy) begin
        bus1_reg_reg_data_out <= {16'b0,bus1_xlpcs_reg_dout};
        bus1_reg_reg_data_out_vld <= 1'b1;
    end else if (bus1_xpcs_reg_rden && ~bus1_xpcs_reg_busy) begin
        bus1_reg_reg_data_out <= {16'b0,bus1_xpcs_reg_dout};
        bus1_reg_reg_data_out_vld <= 1'b1;
    end else if (bus1_mac_reg_rden && ~bus1_mac_reg_busy) begin
        bus1_reg_reg_data_out <= bus1_mac_reg_dout;
        bus1_reg_reg_data_out_vld <= 1'b1;
    end else begin
        // bus1_reg_reg_data_out <= bus1_reg_reg_data_out;
        bus1_reg_reg_data_out_vld <= 1'b0;
    end
end
//====================================================
//bus1 data out 
reg [31:0]bus1_data_out;
reg bus1_data_out_vld;

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        bus1_data_out <= 32'b0;
        bus1_data_out_vld <= 1'b0;
    end else if(bus1_reg_data_out_vld)begin 
        bus1_data_out <= bus1_reg_data_out;
        bus1_data_out_vld <= 1'b1;
    end else if(bus1_reg_reg_data_out_vld)begin
        bus1_data_out <= bus1_reg_reg_data_out;
        bus1_data_out_vld <= 1'b1;
    end else begin
        // bus1_data_out <= bus1_data_out;
        bus1_data_out_vld <= 1'b0;
    end
end
//=====================================================================================
//bus2 reg write
always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus2_reset_register <= 26'h2000200;
    else if(bus2_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_RESET)
        bus2_reset_register <= np_data_in_d1[25:0];
    // else 
    //     bus2_reset_register <= bus2_reset_register ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus2_phy_ctrl_register <= 17'h1281;
    else if(bus2_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_PHY_CTRL_REGISTER)
        bus2_phy_ctrl_register <= np_data_in_d1[16:0];
    // else 
    //     bus2_phy_ctrl_register <= bus2_phy_ctrl_register ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus2_req_lb_register <= 9'b0;
    else if(bus2_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_REQ_LB_REGISTER)
        bus2_req_lb_register <= np_data_in_d1[ 8:0] ;
    // else 
    //     bus2_req_lb_register <= bus2_req_lb_register ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus2_mac_pcs_status_register1 <= 12'b0;
    else if(bus2_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_MAC_PCS_STATUS_REGISTER1)
        bus2_mac_pcs_status_register1 <= np_data_in_d1[11:0];
    // else 
    //     bus2_mac_pcs_status_register1 <= bus2_mac_pcs_status_register1 ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus2_mac_pcs_status_register3 <= 32'b0;
    else if(bus2_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_MAC_PCS_STATUS_REGISTER3)
        bus2_mac_pcs_status_register3 <= np_data_in_d1;
    // else 
    //     bus2_mac_pcs_status_register3 <= bus2_mac_pcs_status_register3 ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus2_mac_pcs_status_register4 <= 32'b0;
    else if(bus2_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_MAC_PCS_STATUS_REGISTER4)
        bus2_mac_pcs_status_register4 <= np_data_in_d1;
    // else 
    //     bus2_mac_pcs_status_register4 <= bus2_mac_pcs_status_register4 ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus2_mac_pcs_status_register5 <= 32'b0;
    else if(bus2_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_MAC_PCS_STATUS_REGISTER5)
        bus2_mac_pcs_status_register5 <= np_data_in_d1;
    // else 
    //     bus2_mac_pcs_status_register5 <= bus2_mac_pcs_status_register5 ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus2_mac_pcs_status_register6 <= 32'b0;
    else if(bus2_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_MAC_PCS_STATUS_REGISTER6)
        bus2_mac_pcs_status_register6 <= np_data_in_d1;
    // else 
    //     bus2_mac_pcs_status_register6 <= bus2_mac_pcs_status_register6 ;
end

//==============================================================
always @(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        bus2_xlpcs_reg_wren <= 1'b0;
        bus2_xlpcs_reg_rden <= 1'b0;
        bus2_xlpcs_reg_addr <= 16'b0;
        bus2_xlpcs_reg_din  <= 16'b0;
    end else if (np_wr && np_addr_in[18:17]==2'b01 && addr_xlpcs_en)begin
        bus2_xlpcs_reg_wren <= 1'b1;
        bus2_xlpcs_reg_rden <= 1'b0;
        bus2_xlpcs_reg_addr <= {np_addr_in[10], 5'b0, np_addr_in[9:0]};// 2022.6.9
        // bus2_xlpcs_reg_addr <= np_addr_in[15:0];
        bus2_xlpcs_reg_din  <= np_data_in[15:0];
    end else if (np_rd && np_addr_in[18:17]==2'b01 && addr_xlpcs_en)begin
        bus2_xlpcs_reg_wren <= 1'b0;
        bus2_xlpcs_reg_rden <= 1'b1;
        bus2_xlpcs_reg_addr <= {np_addr_in[10], 5'b0, np_addr_in[9:0]};// 2022.6.9
        // bus2_xlpcs_reg_addr <= np_addr_in[15:0];
        bus2_xlpcs_reg_din  <= 16'b0;
    end else if (~bus2_xlpcs_reg_busy)begin
        bus2_xlpcs_reg_wren <= 1'b0;
        bus2_xlpcs_reg_rden <= 1'b0;
        bus2_xlpcs_reg_addr <= 16'b0;
        bus2_xlpcs_reg_din  <= 16'b0;
    end 
    // else begin
    //     bus2_xlpcs_reg_wren <= bus2_xlpcs_reg_wren;
    //     bus2_xlpcs_reg_rden <= bus2_xlpcs_reg_rden;
    //     bus2_xlpcs_reg_addr <= bus2_xlpcs_reg_addr;
    //     bus2_xlpcs_reg_din  <= bus2_xlpcs_reg_din ;
    // end
end

always @(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        bus2_xpcs_reg_wren <= 1'b0;
        bus2_xpcs_reg_rden <= 1'b0;
        bus2_xpcs_reg_addr <= 16'b0;
        bus2_xpcs_reg_din  <= 16'b0;
    end else if (np_wr && np_addr_in[18:17]==2'b01 && addr_xpcs_en)begin
        bus2_xpcs_reg_wren <= 1'b1;
        bus2_xpcs_reg_rden <= 1'b0;
        bus2_xpcs_reg_addr <= {6'b0, np_addr_in[9:0]};// 2022.6.9
        // bus2_xpcs_reg_addr <= np_addr_in[15:0];
        bus2_xpcs_reg_din  <= np_data_in[15:0];
    end else if (np_rd && np_addr_in[18:17]==2'b01 && addr_xpcs_en)begin
        bus2_xpcs_reg_wren <= 1'b0;
        bus2_xpcs_reg_rden <= 1'b1;
        bus2_xpcs_reg_addr <= {6'b0, np_addr_in[9:0]};// 2022.6.9
        // bus2_xpcs_reg_addr <= np_addr_in[15:0];
        bus2_xpcs_reg_din  <= 16'b0;
    end else if (~bus2_xpcs_reg_busy)begin
        bus2_xpcs_reg_wren <= 1'b0;
        bus2_xpcs_reg_rden <= 1'b0;
        bus2_xpcs_reg_addr <= 16'b0;
        bus2_xpcs_reg_din  <= 16'b0;
    end 
    // else begin
    //     bus2_xpcs_reg_wren <= bus2_xpcs_reg_wren;
    //     bus2_xpcs_reg_rden <= bus2_xpcs_reg_rden;
    //     bus2_xpcs_reg_addr <= bus2_xpcs_reg_addr;
    //     bus2_xpcs_reg_din  <= bus2_xpcs_reg_din ;
    // end
end


always @(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        bus2_mac_reg_wren <= 1'b0;
        bus2_mac_reg_rden <= 1'b0;
        bus2_mac_reg_addr <= 16'b0;
        bus2_mac_reg_din  <= 16'b0;
    end else if (np_wr && np_addr_in[18:17]==2'b01 && addr_mac_en)begin
        bus2_mac_reg_wren <= 1'b1;
        bus2_mac_reg_rden <= 1'b0;
        bus2_mac_reg_addr <= np_addr_in[ 7:0];
        bus2_mac_reg_din  <= np_data_in[15:0];
    end else if (np_rd && np_addr_in[18:17]==2'b01 && addr_mac_en)begin
        bus2_mac_reg_wren <= 1'b0;
        bus2_mac_reg_rden <= 1'b1;
        bus2_mac_reg_addr <= np_addr_in[ 7:0];
        bus2_mac_reg_din  <= 16'b0;
    end else if (~bus2_mac_reg_busy)begin
        bus2_mac_reg_wren <= 1'b0;
        bus2_mac_reg_rden <= 1'b0;
        bus2_mac_reg_addr <= 16'b0;
        bus2_mac_reg_din  <= 16'b0;
    end 
    // else begin
    //     bus2_mac_reg_wren <= bus2_mac_reg_wren;
    //     bus2_mac_reg_rden <= bus2_mac_reg_rden;
    //     bus2_mac_reg_addr <= bus2_mac_reg_addr;
    //     bus2_mac_reg_din  <= bus2_mac_reg_din ;
    // end
end
//------------------------------------------------------
//bus2 reg read
reg [31:0]bus2_reg_data_out;
reg bus2_reg_data_out_vld;
// reg bus2_cpu_reg_rden_d1;
// always@(posedge clk or negedge rst_n)begin
//     if(~rst_n)
//         bus2_cpu_reg_rden_d1 <= 1'b0;
//     else
//         bus2_cpu_reg_rden_d1 <= bus2_cpu_reg_rden;
// end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        bus2_reg_data_out <= 32'b0;
        bus2_reg_data_out_vld <= 1'b0;
    end else if(bus2_cpu_reg_rden)begin
        case(np_addr_in_d1[9:0])
            `ADDR_RESET                   : begin
                bus2_reg_data_out <= {6'b0,bus2_reset_register}   ;
                bus2_reg_data_out_vld <= 1'b1;
            end
            `ADDR_PHY_CTRL_REGISTER       : begin
                bus2_reg_data_out <= {15'b0,bus2_phy_ctrl_register};
                bus2_reg_data_out_vld <= 1'b1;
            end
            `ADDR_REQ_LB_REGISTER         : begin
                bus2_reg_data_out <= {23'b0,bus2_req_lb_register} ;
                bus2_reg_data_out_vld <= 1'b1;
            end
            `ADDR_ACK_REGISTER            : begin
                bus2_reg_data_out <= {23'b0,bus2_ack_register}    ;
                bus2_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER0: begin
                bus2_reg_data_out <= {4'b0,bus2_mac_pcs_status_register0};
                bus2_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER1: begin
                bus2_reg_data_out <= {20'b0,bus2_mac_pcs_status_register1};
                bus2_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER2: begin
                bus2_reg_data_out <= {15'b0,bus2_mac_pcs_status_register2};
                bus2_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER3: begin
                bus2_reg_data_out <= bus2_mac_pcs_status_register3;
                bus2_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER4: begin
                bus2_reg_data_out <= bus2_mac_pcs_status_register4;
                bus2_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER5: begin
                bus2_reg_data_out <= bus2_mac_pcs_status_register5;
                bus2_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER6: begin
                bus2_reg_data_out <= bus2_mac_pcs_status_register6;
                bus2_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER7: begin
                bus2_reg_data_out <= bus2_mac_pcs_status_register7;
                bus2_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER8: begin
                bus2_reg_data_out <= bus2_mac_pcs_status_register8;
                bus2_reg_data_out_vld <= 1'b1;
            end
            default                       : begin
                // bus2_reg_data_out <= bus2_reg_data_out ;
                bus2_reg_data_out_vld <= 1'b0;
            end
        endcase 
    end else begin
        // bus2_reg_data_out <= bus2_reg_data_out ;
        bus2_reg_data_out_vld <= 1'b0;
    end
end
//-------------------------------------------------------------
reg [31:0]bus2_reg_reg_data_out;
reg bus2_reg_reg_data_out_vld;
always@(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        bus2_reg_reg_data_out <= 32'b0;
        bus2_reg_reg_data_out_vld <= 1'b0;
    end else if (bus2_xlpcs_reg_rden && ~bus2_xlpcs_reg_busy) begin
        bus2_reg_reg_data_out <= {16'b0,bus2_xlpcs_reg_dout};
        bus2_reg_reg_data_out_vld <= 1'b1;
    end else if (bus2_xpcs_reg_rden && ~bus2_xpcs_reg_busy) begin
        bus2_reg_reg_data_out <= {16'b0,bus2_xpcs_reg_dout};
        bus2_reg_reg_data_out_vld <= 1'b1;
    end else if (bus2_mac_reg_rden && ~bus2_mac_reg_busy) begin
        bus2_reg_reg_data_out <= bus2_mac_reg_dout;
        bus2_reg_reg_data_out_vld <= 1'b1;
    end else begin
        // bus2_reg_reg_data_out <= bus2_reg_reg_data_out;
        bus2_reg_reg_data_out_vld <= 1'b0;
    end
end
//====================================================
//bus2 data out 
reg [31:0]bus2_data_out;
reg bus2_data_out_vld;


always@(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        bus2_data_out <= 32'b0;
        bus2_data_out_vld <= 1'b0;
    end else if(bus2_reg_data_out_vld)begin 
        bus2_data_out <= bus2_reg_data_out;
        bus2_data_out_vld <= 1'b1;
    end else if(bus2_reg_reg_data_out_vld)begin
        bus2_data_out <= bus2_reg_reg_data_out;
        bus2_data_out_vld <= 1'b1;
    end else begin
        // bus2_data_out <= bus2_data_out;
        bus2_data_out_vld <= 1'b0;
    end
end


//=====================================================================================
//bus3 reg write
always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus3_reset_register <= 26'h2000200;
    else if(bus3_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_RESET)
        bus3_reset_register <= np_data_in_d1[25:0];
    // else 
    //     bus3_reset_register <= bus3_reset_register ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus3_phy_ctrl_register <= 17'h1281;
    else if(bus3_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_PHY_CTRL_REGISTER)
        bus3_phy_ctrl_register <= np_data_in_d1[16:0];
    // else 
    //     bus3_phy_ctrl_register <= bus3_phy_ctrl_register ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus3_req_lb_register <= 9'b0;
    else if(bus3_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_REQ_LB_REGISTER)
        bus3_req_lb_register <= np_data_in_d1[ 8:0] ;
    // else 
    //     bus3_req_lb_register <= bus3_req_lb_register ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus3_mac_pcs_status_register1 <= 12'b0;
    else if(bus3_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_MAC_PCS_STATUS_REGISTER1)
        bus3_mac_pcs_status_register1 <= np_data_in_d1[11:0];
    // else 
    //     bus3_mac_pcs_status_register1 <= bus3_mac_pcs_status_register1 ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus3_mac_pcs_status_register3 <= 32'b0;
    else if(bus3_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_MAC_PCS_STATUS_REGISTER3)
        bus3_mac_pcs_status_register3 <= np_data_in_d1;
    // else 
    //     bus3_mac_pcs_status_register3 <= bus3_mac_pcs_status_register3 ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus3_mac_pcs_status_register4 <= 32'b0;
    else if(bus3_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_MAC_PCS_STATUS_REGISTER4)
        bus3_mac_pcs_status_register4 <= np_data_in_d1;
    // else 
    //     bus3_mac_pcs_status_register4 <= bus3_mac_pcs_status_register4 ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus3_mac_pcs_status_register5 <= 32'b0;
    else if(bus3_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_MAC_PCS_STATUS_REGISTER5)
        bus3_mac_pcs_status_register5 <= np_data_in_d1;
    // else 
    //     bus3_mac_pcs_status_register5 <= bus3_mac_pcs_status_register5 ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus3_mac_pcs_status_register6 <= 32'b0;
    else if(bus3_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_MAC_PCS_STATUS_REGISTER6)
        bus3_mac_pcs_status_register6 <= np_data_in_d1;
    // else 
    //     bus3_mac_pcs_status_register6 <= bus3_mac_pcs_status_register6 ;
end

//==============================================================
always @(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        bus3_xlpcs_reg_wren <= 1'b0;
        bus3_xlpcs_reg_rden <= 1'b0;
        bus3_xlpcs_reg_addr <= 16'b0;
        bus3_xlpcs_reg_din  <= 16'b0;
    end else if (np_wr && np_addr_in[18:17]==2'b10 && addr_xlpcs_en)begin
        bus3_xlpcs_reg_wren <= 1'b1;
        bus3_xlpcs_reg_rden <= 1'b0;
        bus3_xlpcs_reg_addr <= {np_addr_in[10], 5'b0, np_addr_in[9:0]};// 2022.6.9
        // bus3_xlpcs_reg_addr <= np_addr_in[15:0];
        bus3_xlpcs_reg_din  <= np_data_in[15:0];
    end else if (np_rd && np_addr_in[18:17]==2'b10 && addr_xlpcs_en)begin
        bus3_xlpcs_reg_wren <= 1'b0;
        bus3_xlpcs_reg_rden <= 1'b1;
        bus3_xlpcs_reg_addr <= {np_addr_in[10], 5'b0, np_addr_in[9:0]};// 2022.6.9
        // bus3_xlpcs_reg_addr <= np_addr_in[15:0];
        bus3_xlpcs_reg_din  <= 16'b0;
    end else if (~bus3_xlpcs_reg_busy)begin
        bus3_xlpcs_reg_wren <= 1'b0;
        bus3_xlpcs_reg_rden <= 1'b0;
        bus3_xlpcs_reg_addr <= 16'b0;
        bus3_xlpcs_reg_din  <= 16'b0;
    end 
    // else begin
    //     bus3_xlpcs_reg_wren <= bus3_xlpcs_reg_wren;
    //     bus3_xlpcs_reg_rden <= bus3_xlpcs_reg_rden;
    //     bus3_xlpcs_reg_addr <= bus3_xlpcs_reg_addr;
    //     bus3_xlpcs_reg_din  <= bus3_xlpcs_reg_din ;
    // end
end

always @(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        bus3_xpcs_reg_wren <= 1'b0;
        bus3_xpcs_reg_rden <= 1'b0;
        bus3_xpcs_reg_addr <= 16'b0;
        bus3_xpcs_reg_din  <= 16'b0;
    end else if (np_wr && np_addr_in[18:17]==2'b10 && addr_xpcs_en)begin
        bus3_xpcs_reg_wren <= 1'b1;
        bus3_xpcs_reg_rden <= 1'b0;
        bus3_xpcs_reg_addr <= {6'b0, np_addr_in[9:0]};// 2022.6.9
        // bus3_xpcs_reg_addr <= np_addr_in[15:0];
        bus3_xpcs_reg_din  <= np_data_in[15:0];
    end else if (np_rd && np_addr_in[18:17]==2'b10 && addr_xpcs_en)begin
        bus3_xpcs_reg_wren <= 1'b0;
        bus3_xpcs_reg_rden <= 1'b1;
        bus3_xpcs_reg_addr <= {6'b0, np_addr_in[9:0]};// 2022.6.9
        // bus3_xpcs_reg_addr <= np_addr_in[15:0];
        bus3_xpcs_reg_din  <= 16'b0;
    end else if (~bus3_xpcs_reg_busy)begin
        bus3_xpcs_reg_wren <= 1'b0;
        bus3_xpcs_reg_rden <= 1'b0;
        bus3_xpcs_reg_addr <= 16'b0;
        bus3_xpcs_reg_din  <= 16'b0;
    end 
    // else begin
    //     bus3_xpcs_reg_wren <= bus3_xpcs_reg_wren;
    //     bus3_xpcs_reg_rden <= bus3_xpcs_reg_rden;
    //     bus3_xpcs_reg_addr <= bus3_xpcs_reg_addr;
    //     bus3_xpcs_reg_din  <= bus3_xpcs_reg_din ;
    // end
end


always @(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        bus3_mac_reg_wren <= 1'b0;
        bus3_mac_reg_rden <= 1'b0;
        bus3_mac_reg_addr <= 16'b0;
        bus3_mac_reg_din  <= 16'b0;
    end else if (np_wr && np_addr_in[18:17]==2'b10 && addr_mac_en)begin 
        bus3_mac_reg_wren <= 1'b1;
        bus3_mac_reg_rden <= 1'b0;
        bus3_mac_reg_addr <= np_addr_in[ 7:0];
        bus3_mac_reg_din  <= np_data_in[15:0];
    end else if (np_rd && np_addr_in[18:17]==2'b10 && addr_mac_en)begin
        bus3_mac_reg_wren <= 1'b0;
        bus3_mac_reg_rden <= 1'b1;
        bus3_mac_reg_addr <= np_addr_in[ 7:0];
        bus3_mac_reg_din  <= 16'b0;
    end else if (~bus3_mac_reg_busy)begin
        bus3_mac_reg_wren <= 1'b0;
        bus3_mac_reg_rden <= 1'b0;
        bus3_mac_reg_addr <= 16'b0;
        bus3_mac_reg_din  <= 16'b0;
    end 
    // else begin
    //     bus3_mac_reg_wren <= bus3_mac_reg_wren;
    //     bus3_mac_reg_rden <= bus3_mac_reg_rden;
    //     bus3_mac_reg_addr <= bus3_mac_reg_addr;
    //     bus3_mac_reg_din  <= bus3_mac_reg_din ;
    // end
end
//------------------------------------------------------
//bus3 reg read
reg [31:0]bus3_reg_data_out;
reg bus3_reg_data_out_vld;
// reg bus3_cpu_reg_rden_d1;
// always@(posedge clk or negedge rst_n)begin
//     if(~rst_n)
//         bus3_cpu_reg_rden_d1 <= 1'b0;
//     else
//         bus3_cpu_reg_rden_d1 <= bus3_cpu_reg_rden;
// end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        bus3_reg_data_out <= 32'b0;
        bus3_reg_data_out_vld <= 1'b0;
    end else if(bus3_cpu_reg_rden)begin
        case(np_addr_in_d1[9:0])
            `ADDR_RESET                   : begin
                bus3_reg_data_out <= {6'b0,bus3_reset_register}   ;
                bus3_reg_data_out_vld <= 1'b1;
            end
            `ADDR_PHY_CTRL_REGISTER       : begin
                bus3_reg_data_out <= {15'b0,bus3_phy_ctrl_register};
                bus3_reg_data_out_vld <= 1'b1;
            end
            `ADDR_REQ_LB_REGISTER         : begin
                bus3_reg_data_out <= {23'b0,bus3_req_lb_register} ;
                bus3_reg_data_out_vld <= 1'b1;
            end
            `ADDR_ACK_REGISTER            : begin
                bus3_reg_data_out <= {23'b0,bus3_ack_register}    ;
                bus3_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER0: begin
                bus3_reg_data_out <= {4'b0,bus3_mac_pcs_status_register0};
                bus3_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER1: begin
                bus3_reg_data_out <= {20'b0,bus3_mac_pcs_status_register1};
                bus3_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER2: begin
                bus3_reg_data_out <= {15'b0,bus3_mac_pcs_status_register2};
                bus3_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER3: begin
                bus3_reg_data_out <= bus3_mac_pcs_status_register3;
                bus3_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER4: begin
                bus3_reg_data_out <= bus3_mac_pcs_status_register4;
                bus3_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER5: begin
                bus3_reg_data_out <= bus3_mac_pcs_status_register5;
                bus3_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER6: begin
                bus3_reg_data_out <= bus3_mac_pcs_status_register6;
                bus3_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER7: begin
                bus3_reg_data_out <= bus3_mac_pcs_status_register7;
                bus3_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER8: begin
                bus3_reg_data_out <= bus3_mac_pcs_status_register8;
                bus3_reg_data_out_vld <= 1'b1;
            end
            default                       : begin
                // bus3_reg_data_out <= bus3_reg_data_out ;
                bus3_reg_data_out_vld <= 1'b0;
            end
        endcase 
    end else begin
        // bus3_reg_data_out <= bus3_reg_data_out ;
        bus3_reg_data_out_vld <= 1'b0;
    end
end
//-----------------------------------------------------
reg [31:0]bus3_reg_reg_data_out;
reg bus3_reg_reg_data_out_vld;
always@(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        bus3_reg_reg_data_out <= 32'b0;
        bus3_reg_reg_data_out_vld <= 1'b0;
    end else if (bus3_xlpcs_reg_rden && ~bus3_xlpcs_reg_busy) begin
        bus3_reg_reg_data_out <= {16'b0,bus3_xlpcs_reg_dout};
        bus3_reg_reg_data_out_vld <= 1'b1;
    end else if (bus3_xpcs_reg_rden && ~bus3_xpcs_reg_busy) begin
        bus3_reg_reg_data_out <= {16'b0,bus3_xpcs_reg_dout};
        bus3_reg_reg_data_out_vld <= 1'b1;
    end else if (bus3_mac_reg_rden && ~bus3_mac_reg_busy) begin
        bus3_reg_reg_data_out <= bus3_mac_reg_dout;
        bus3_reg_reg_data_out_vld <= 1'b1;
    end else begin
        // bus3_reg_reg_data_out <= bus3_reg_reg_data_out;
        bus3_reg_reg_data_out_vld <= 1'b0;
    end
end
//====================================================
//bus3 data out 
reg [31:0]bus3_data_out;
reg bus3_data_out_vld;


always@(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        bus3_data_out <= 32'b0;
        bus3_data_out_vld <= 1'b0;
    end else if(bus3_reg_data_out_vld)begin 
        bus3_data_out <= bus3_reg_data_out;
        bus3_data_out_vld <= 1'b1;
    end else if(bus3_reg_reg_data_out_vld)begin
        bus3_data_out <= bus3_reg_reg_data_out;
        bus3_data_out_vld <= 1'b1;
    end else begin
        // bus3_data_out <= bus3_data_out;
        bus3_data_out_vld <= 1'b0;
    end
end



//=====================================================================================
//bus4 reg write
always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus4_reset_register <= 26'h2000200;
    else if(bus4_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_RESET)
        bus4_reset_register <= np_data_in_d1[25:0];
    // else 
    //     bus4_reset_register <= bus4_reset_register ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus4_phy_ctrl_register <= 17'h1281;
    else if(bus4_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_PHY_CTRL_REGISTER)
        bus4_phy_ctrl_register <= np_data_in_d1[16:0];
    // else 
    //     bus4_phy_ctrl_register <= bus4_phy_ctrl_register ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus4_req_lb_register <= 9'b0;
    else if(bus4_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_REQ_LB_REGISTER)
        bus4_req_lb_register <= np_data_in_d1[ 8:0] ;
    // else 
    //     bus4_req_lb_register <= bus4_req_lb_register ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus4_mac_pcs_status_register1 <= 12'b0;
    else if(bus4_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_MAC_PCS_STATUS_REGISTER1)
        bus4_mac_pcs_status_register1 <= np_data_in_d1[11:0];
    // else 
    //     bus4_mac_pcs_status_register1 <= bus4_mac_pcs_status_register1 ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus4_mac_pcs_status_register3 <= 32'b0;
    else if(bus4_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_MAC_PCS_STATUS_REGISTER3)
        bus4_mac_pcs_status_register3 <= np_data_in_d1;
    // else 
    //     bus4_mac_pcs_status_register3 <= bus4_mac_pcs_status_register3 ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus4_mac_pcs_status_register4 <= 32'b0;
    else if(bus4_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_MAC_PCS_STATUS_REGISTER4)
        bus4_mac_pcs_status_register4 <= np_data_in_d1;
    // else 
    //     bus4_mac_pcs_status_register4 <= bus4_mac_pcs_status_register4 ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus4_mac_pcs_status_register5 <= 32'b0;
    else if(bus4_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_MAC_PCS_STATUS_REGISTER5)
        bus4_mac_pcs_status_register5 <= np_data_in_d1;
    // else 
    //     bus4_mac_pcs_status_register5 <= bus4_mac_pcs_status_register5 ;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        bus4_mac_pcs_status_register6 <= 32'b0;
    else if(bus4_cpu_reg_wren && np_addr_in_d1[9:0]==`ADDR_MAC_PCS_STATUS_REGISTER6)
        bus4_mac_pcs_status_register6 <= np_data_in_d1;
    // else 
    //     bus4_mac_pcs_status_register6 <= bus4_mac_pcs_status_register6 ;
end

//==============================================================
always @(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        bus4_xlpcs_reg_wren <= 1'b0;
        bus4_xlpcs_reg_rden <= 1'b0;
        bus4_xlpcs_reg_addr <= 16'b0;
        bus4_xlpcs_reg_din  <= 16'b0;
    end else if (np_wr && np_addr_in[18:17]==2'b11 && addr_xlpcs_en)begin
        bus4_xlpcs_reg_wren <= 1'b1;
        bus4_xlpcs_reg_rden <= 1'b0;
        bus4_xlpcs_reg_addr <= {np_addr_in[10], 5'b0, np_addr_in[9:0]};// 2022.6.9
        // bus4_xlpcs_reg_addr <= np_addr_in[15:0];
        bus4_xlpcs_reg_din  <= np_data_in[15:0];
    end else if (np_rd && np_addr_in[18:17]==2'b11 && addr_xlpcs_en)begin
        bus4_xlpcs_reg_wren <= 1'b0;
        bus4_xlpcs_reg_rden <= 1'b1;
        bus4_xlpcs_reg_addr <= {np_addr_in[10], 5'b0, np_addr_in[9:0]};// 2022.6.9
        // bus4_xlpcs_reg_addr <= np_addr_in[15:0];
        bus4_xlpcs_reg_din  <= 16'b0;
    end else if (~bus4_xlpcs_reg_busy)begin
        bus4_xlpcs_reg_wren <= 1'b0;
        bus4_xlpcs_reg_rden <= 1'b0;
        bus4_xlpcs_reg_addr <= 16'b0;
        bus4_xlpcs_reg_din  <= 16'b0;
    end 
    // else begin
    //     bus4_xlpcs_reg_wren <= bus4_xlpcs_reg_wren;
    //     bus4_xlpcs_reg_rden <= bus4_xlpcs_reg_rden;
    //     bus4_xlpcs_reg_addr <= bus4_xlpcs_reg_addr;
    //     bus4_xlpcs_reg_din  <= bus4_xlpcs_reg_din ;
    // end
end

always @(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        bus4_xpcs_reg_wren <= 1'b0;
        bus4_xpcs_reg_rden <= 1'b0;
        bus4_xpcs_reg_addr <= 16'b0;
        bus4_xpcs_reg_din  <= 16'b0;
    end else if (np_wr && np_addr_in[18:17]==2'b11 && addr_xpcs_en)begin
        bus4_xpcs_reg_wren <= 1'b1;
        bus4_xpcs_reg_rden <= 1'b0;
        bus4_xpcs_reg_addr <= {6'b0, np_addr_in[9:0]};// 2022.6.9
        // bus4_xpcs_reg_addr <= np_addr_in[15:0];
        bus4_xpcs_reg_din  <= np_data_in[15:0];
    end else if (np_rd && np_addr_in[18:17]==2'b11 && addr_xpcs_en)begin
        bus4_xpcs_reg_wren <= 1'b0;
        bus4_xpcs_reg_rden <= 1'b1;
        bus4_xpcs_reg_addr <= {6'b0, np_addr_in[9:0]};// 2022.6.9
        // bus4_xpcs_reg_addr <= np_addr_in[15:0];
        bus4_xpcs_reg_din  <= 16'b0;
    end else if (~bus4_xpcs_reg_busy)begin
        bus4_xpcs_reg_wren <= 1'b0;
        bus4_xpcs_reg_rden <= 1'b0;
        bus4_xpcs_reg_addr <= 16'b0;
        bus4_xpcs_reg_din  <= 16'b0;
    end 
    // else begin
    //     bus4_xpcs_reg_wren <= bus4_xpcs_reg_wren;
    //     bus4_xpcs_reg_rden <= bus4_xpcs_reg_rden;
    //     bus4_xpcs_reg_addr <= bus4_xpcs_reg_addr;
    //     bus4_xpcs_reg_din  <= bus4_xpcs_reg_din ;
    // end
end


always @(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        bus4_mac_reg_wren <= 1'b0;
        bus4_mac_reg_rden <= 1'b0;
        bus4_mac_reg_addr <= 16'b0;
        bus4_mac_reg_din  <= 16'b0;
    end else if (np_wr && np_addr_in[18:17]==2'b11 && addr_mac_en)begin
        bus4_mac_reg_wren <= 1'b1;
        bus4_mac_reg_rden <= 1'b0;
        bus4_mac_reg_addr <= np_addr_in[ 7:0];
        bus4_mac_reg_din  <= np_data_in[15:0];
    end else if (np_rd && np_addr_in[18:17]==2'b11 && addr_mac_en)begin
        bus4_mac_reg_wren <= 1'b0;
        bus4_mac_reg_rden <= 1'b1;
        bus4_mac_reg_addr <= np_addr_in[ 7:0];
        bus4_mac_reg_din  <= 16'b0;
    end else if (~bus4_mac_reg_busy)begin
        bus4_mac_reg_wren <= 1'b0;
        bus4_mac_reg_rden <= 1'b0;
        bus4_mac_reg_addr <= 16'b0;
        bus4_mac_reg_din  <= 16'b0;
    end 
    // else begin
    //     bus4_mac_reg_wren <= bus4_mac_reg_wren;
    //     bus4_mac_reg_rden <= bus4_mac_reg_rden;
    //     bus4_mac_reg_addr <= bus4_mac_reg_addr;
    //     bus4_mac_reg_din  <= bus4_mac_reg_din ;
    // end
end
//------------------------------------------------------
//bus4 reg read
reg [31:0]bus4_reg_data_out;
reg bus4_reg_data_out_vld;
// reg bus4_cpu_reg_rden_d1;
// always@(posedge clk or negedge rst_n)begin
//     if(~rst_n)
//         bus4_cpu_reg_rden_d1 <= 1'b0;
//     else
//         bus4_cpu_reg_rden_d1 <= bus4_cpu_reg_rden;
// end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        bus4_reg_data_out <= 32'b0;
        bus4_reg_data_out_vld <= 1'b0;
    end else if(bus4_cpu_reg_rden)begin
        case(np_addr_in_d1[9:0])
            `ADDR_RESET                   : begin
                bus4_reg_data_out <= {6'b0,bus4_reset_register}   ;
                bus4_reg_data_out_vld <= 1'b1;
            end
            `ADDR_PHY_CTRL_REGISTER       : begin
                bus4_reg_data_out <= {15'b0,bus4_phy_ctrl_register};
                bus4_reg_data_out_vld <= 1'b1;
            end
            `ADDR_REQ_LB_REGISTER         : begin
                bus4_reg_data_out <= {23'b0,bus4_req_lb_register} ;
                bus4_reg_data_out_vld <= 1'b1;
            end
            `ADDR_ACK_REGISTER            : begin
                bus4_reg_data_out <= {23'b0,bus4_ack_register}    ;
                bus4_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER0: begin
                bus4_reg_data_out <= {4'b0,bus4_mac_pcs_status_register0};
                bus4_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER1: begin
                bus4_reg_data_out <= {20'b0,bus4_mac_pcs_status_register1};
                bus4_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER2: begin
                bus4_reg_data_out <= {15'b0,bus4_mac_pcs_status_register2};
                bus4_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER3: begin
                bus4_reg_data_out <= bus4_mac_pcs_status_register3;
                bus4_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER4: begin
                bus4_reg_data_out <= bus4_mac_pcs_status_register4;
                bus4_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER5: begin
                bus4_reg_data_out <= bus4_mac_pcs_status_register5;
                bus4_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER6: begin
                bus4_reg_data_out <= bus4_mac_pcs_status_register6;
                bus4_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER7: begin
                bus4_reg_data_out <= bus4_mac_pcs_status_register7;
                bus4_reg_data_out_vld <= 1'b1;
            end
            `ADDR_MAC_PCS_STATUS_REGISTER8: begin
                bus4_reg_data_out <= bus4_mac_pcs_status_register8;
                bus4_reg_data_out_vld <= 1'b1;
            end
            default                       : begin
                // bus4_reg_data_out <= bus4_reg_data_out ;
                bus4_reg_data_out_vld <= 1'b0;
            end
        endcase 
    end else begin
        // bus4_reg_data_out <= bus4_reg_data_out ;
        bus4_reg_data_out_vld <= 1'b0;
    end
end
//---------------------------------------------------
reg [31:0]bus4_reg_reg_data_out;
reg bus4_reg_reg_data_out_vld;
always@(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        bus4_reg_reg_data_out <= 32'b0;
        bus4_reg_reg_data_out_vld <= 1'b0;
    end else if (bus4_xlpcs_reg_rden && ~bus4_xlpcs_reg_busy) begin
        bus4_reg_reg_data_out <= {16'b0,bus4_xlpcs_reg_dout};
        bus4_reg_reg_data_out_vld <= 1'b1;
    end else if (bus4_xpcs_reg_rden && ~bus4_xpcs_reg_busy) begin
        bus4_reg_reg_data_out <= {16'b0,bus4_xpcs_reg_dout};
        bus4_reg_reg_data_out_vld <= 1'b1;
    end else if (bus4_mac_reg_rden && ~bus4_mac_reg_busy) begin
        bus4_reg_reg_data_out <= bus4_mac_reg_dout;
        bus4_reg_reg_data_out_vld <= 1'b1;
    end else begin
        // bus4_reg_reg_data_out <= bus4_reg_reg_data_out;
        bus4_reg_reg_data_out_vld <= 1'b0;
    end
end
//====================================================
//bus4 data out 
reg [31:0]bus4_data_out;
reg bus4_data_out_vld;


always@(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        bus4_data_out <= 32'b0;
        bus4_data_out_vld <= 1'b0;
    end else if(bus4_reg_data_out_vld)begin 
        bus4_data_out <= bus4_reg_data_out;
        bus4_data_out_vld <= 1'b1;
    end else if(bus4_reg_reg_data_out_vld)begin
        bus4_data_out <= bus4_reg_reg_data_out;
        bus4_data_out_vld <= 1'b1;
    end else begin
        // bus4_data_out <= bus4_data_out;
        bus4_data_out_vld <= 1'b0;
    end
end




always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        np_data_out <= 32'b0;
    else if(bus1_data_out_vld)
        np_data_out <= bus1_data_out;
    else if(bus2_data_out_vld)
        np_data_out <= bus2_data_out;
    else if(bus3_data_out_vld)
        np_data_out <= bus3_data_out;
    else if(bus4_data_out_vld)
        np_data_out <= bus4_data_out;
    // else
    //     np_data_out <= np_data_out;
end

always@(posedge clk or negedge rst_n)begin
    if(~rst_n)
        np_data_out_vld <= 1'b0;
    else if(bus1_data_out_vld || bus2_data_out_vld || bus3_data_out_vld || bus4_data_out_vld)
        np_data_out_vld <= 1'b1;
    else
        np_data_out_vld <= 1'b0;
end





endmodule

